package reflect;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.SocketTimeoutException;
import java.net.URISyntaxException;

/**
 * 自动调用与当前类所在包下所有类的main方法
 *
 * 自动调用与当前类不在同一个包下(指定一个包名)所有类的main方法
 */
public class reflectDemo9 {
    public static void main(String[] args) throws URISyntaxException, ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException {
        /*
            类加载路径
            可以理解为是当前类所在顶级包的上一层,如果从源码目录看相当于是java目录,实际是所有字节码文件编译后的
            顶级包的上一层.target/classes这里
         */
        File dir = new File(reflectDemo9.class.getClassLoader().getResource(".").toURI());
        File[] subs = dir.listFiles(f -> f.getName().endsWith(".class"));
        for (File file : subs) {
            String fileName = file.getName();
            String className = fileName.substring(0, fileName.indexOf("."));
            Class cls = Class.forName("reflect." + className);

            try {
                Method m = cls.getMethod("main", String[].class);
                System.out.println("执行" + className + "的main方法");
                m.invoke(null, (Object) new String[]{});
            } catch (NoSuchMethodException e) {
            }
        }
    }
}

